package com.inei.cie.dao;

import java.io.IOException;
import java.util.ArrayList;
import java.util.List;

import org.apache.http.HttpResponse;
import org.apache.http.ParseException;
import org.apache.http.client.ClientProtocolException;
import org.apache.http.client.HttpClient;
import org.apache.http.client.methods.HttpPost;
import org.apache.http.entity.StringEntity;
import org.apache.http.impl.client.DefaultHttpClient;
import org.apache.http.util.EntityUtils;
import org.json.JSONArray;
import org.json.JSONException;
import org.json.JSONObject;

import com.inei.cie.entidades.PUNTO3;
import com.inei.cie.entidades.PUNTOS_GPS;
import com.inei.cie.utilitarios.ListadoPrediosRuralAdapter;
import com.inei.conexion.Conexion;

import android.content.ContentValues;
import android.content.Context;
import android.database.Cursor;
import android.database.sqlite.SQLiteDatabase;

public class CapituloIIIDao {
	private UtilDB util;
	SQLiteDatabase db;
	Cursor cursor = null;
	public static Boolean CORRECTO;
	private static final Conexion con = new Conexion();
	private String conexion = con.conexion;

	public CapituloIIIDao(Context context) {
		util = new UtilDB(context);
	}

	public void ingresarCapitulo3(String codigoLocalPadron,
			String codigoLugarGeoreferenciacion, String rutaFoto,
			String codigoPredio, String textoP1, String latitudP1,
			String longitudP1, String altitudP1, String textoP2,
			String latitudP2, String longitudP2, String altitudP2,
			String textoP3, String latitudP3, String longitudP3,
			String altitudP3, String textoP4, String latitudP4,
			String longitudP4, String altitudP4, String textoP5,
			String latitudP5, String longitudP5, String altitudP5,
			String textoP6, String latitudP6, String longitudP6,
			String altitudP6, String textoP7, String latitudP7,
			String longitudP7, String altitudP7, String textoP8,
			String latitudP8, String longitudP8, String altitudP8,
			String textoP9, String latitudP9, String longitudP9,
			String altitudP9, String textoP10, String latitudP10,
			String longitudP10, String altitudP10, String observaciones,
			int version, String swEnviado, String swCompleto) {
		eliminarPuntosGPS(codigoLocalPadron, Integer.parseInt(codigoPredio));
		db = util.getWritableDatabase();
		String sqlInsertDatosCapitulo3 = "INSERT INTO PUNTO3 "
				+ "VALUES(null, '" + codigoLocalPadron + "', " + codigoPredio
				+ ",'" + codigoLugarGeoreferenciacion + "', '" + rutaFoto
				+ "', '" + observaciones + "', " + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		db.execSQL(sqlInsertDatosCapitulo3);
		String sqlInsertPuntosGPS1 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP1 + "', '" + latitudP1 + "', '"
				+ longitudP1 + "', '" + altitudP1 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS2 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP2 + "', '" + latitudP2 + "', '"
				+ longitudP2 + "', '" + altitudP2 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS3 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP3 + "', '" + latitudP3 + "', '"
				+ longitudP3 + "', '" + altitudP3 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS4 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP4 + "', '" + latitudP4 + "', '"
				+ longitudP4 + "', '" + altitudP4 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS5 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP5 + "', '" + latitudP5 + "', '"
				+ longitudP5 + "', '" + altitudP5 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS6 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP6 + "', '" + latitudP6 + "', '"
				+ longitudP6 + "', '" + altitudP6 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS7 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP7 + "', '" + latitudP7 + "', '"
				+ longitudP7 + "', '" + altitudP7 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS8 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP8 + "', '" + latitudP8 + "', '"
				+ longitudP8 + "', '" + altitudP8 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS9 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP9 + "', '" + latitudP9 + "', '"
				+ longitudP9 + "', '" + altitudP9 + "', '" + codigoLocalPadron
				+ "', " + codigoPredio + "," + version + ",'" + swEnviado
				+ "','" + swCompleto + "') ";
		String sqlInsertPuntosGPS10 = "INSERT INTO PUNTOS_GPS "
				+ "Values(null, '" + textoP10 + "', '" + latitudP10 + "', '"
				+ longitudP10 + "', '" + altitudP10 + "', '"
				+ codigoLocalPadron + "', " + codigoPredio + "," + version
				+ ",'" + swEnviado + "','" + swCompleto + "') ";
		db.execSQL(sqlInsertPuntosGPS1);
		db.execSQL(sqlInsertPuntosGPS2);
		db.execSQL(sqlInsertPuntosGPS3);
		db.execSQL(sqlInsertPuntosGPS4);
		db.execSQL(sqlInsertPuntosGPS5);
		db.execSQL(sqlInsertPuntosGPS6);
		db.execSQL(sqlInsertPuntosGPS7);
		db.execSQL(sqlInsertPuntosGPS8);
		db.execSQL(sqlInsertPuntosGPS9);
		db.execSQL(sqlInsertPuntosGPS10);
		CORRECTO = true;
	}

	public void crearCapitulo3(String codigoLocalPadron, int codigoPredio) {
		if (!existeCapitulo3(codigoLocalPadron, codigoPredio)) {
			db = util.getWritableDatabase();
			ContentValues c = new ContentValues();
			c.put("codigoLocalPadron", codigoLocalPadron);
			c.put("codigoPredio", codigoPredio);
			db.insert("PUNTO3", null, c);
			db.close();

			for (int i = 0; i < 10; i++) {
				db = util.getWritableDatabase();
				ContentValues c2 = new ContentValues();
				c2.put("codigoLocalPadron", codigoLocalPadron);
				c2.put("codigoPredio", codigoPredio);
				c2.put("codigoPuntoGPS", (i + 1));
				db.insert("PUNTOS_GPS", null, c2);
			}
		}
	}

	public boolean existeCapitulo3(String codigoLocalPadron, int codigoPredio) {
		db = util.getReadableDatabase();
		cursor = db
				.rawQuery(
						"select * from PUNTO3 where codigoLocalPadron=? and codigoPredio=?",
						new String[] { codigoLocalPadron + "",
								codigoPredio + "" });
		if (cursor.moveToFirst()) {
			Cerrar();
			return true;
		} else {
			Cerrar();
			return false;
		}
	}

	public void actualizarCapitulo3(PUNTO3 obj, List<PUNTOS_GPS> listaGps) {
		db = util.getWritableDatabase();
		ContentValues c = new ContentValues();
		c.put("idPunto3", obj.getIdPunto3());
		c.put("codigoLugarGeoreferenciacion",
				obj.getCodigoLugarGeoreferenciacion());
		c.put("rutaFoto", obj.getRutaFoto());
		c.put("observaciones", obj.getObservaciones());
		c.put("Version", obj.getVersion());
		c.put("SwCompleto", obj.isSwCompleto());
		c.put("SwEnviado", obj.isSwEnviado());
		db.update(
				"PUNTO3",
				c,
				"codigoLocalPadron=? and codigoPredio=?",
				new String[] { obj.getCodigoLocalPadron() + "",
						obj.getCodigoPredio() + "" });
		for (int i = 0; i < listaGps.size(); i++) {
			ContentValues cGps = new ContentValues();
			cGps.put("textoPunto", listaGps.get(i).getTextoPunto());
			cGps.put("latitudPunto", listaGps.get(i).getLatitudPunto());
			cGps.put("longitudPunto", listaGps.get(i).getLongitudPunto());
			cGps.put("altitudPunto", listaGps.get(i).getAltitudPunto());
			cGps.put("Version", listaGps.get(i).getVersion());
			cGps.put("SwCompleto", listaGps.get(i).isSwCompleto());
			cGps.put("SwEnviado", listaGps.get(i).isSwEnviado());
			db.update(
					"PUNTOS_GPS",
					cGps,
					"codigoLocalPadron=? and codigoPredio=? and codigoPuntoGPS=?",
					new String[] { listaGps.get(i).getCodigoLocalPadron() + "",
							listaGps.get(i).getCodigoPredio() + "",
							listaGps.get(i).getCodigoPuntoGPS() + "" });
		}
		Cerrar();
	}

	public List<Object> obtenerCapitulo3(String codigoLocalPadron,
			int codigoPredio) {
		PUNTO3 obj = new PUNTO3();
		List<PUNTOS_GPS> listaGPS = new ArrayList<PUNTOS_GPS>();

		db = util.getReadableDatabase();
		cursor = db
				.rawQuery(
						"select * from PUNTO3 where codigoLocalPadron=? and codigoPredio=?",
						new String[] { codigoLocalPadron + "",
								codigoPredio + "" });
		if (cursor.moveToFirst()) {
			obj.setCodigoLocalPadron(cursor.getString(cursor
					.getColumnIndex("codigoLocalPadron")));
			obj.setCodigoPredio(cursor.getInt(cursor
					.getColumnIndex("codigoPredio")));
			obj.setCodigoLugarGeoreferenciacion(cursor.getString(cursor
					.getColumnIndex("codigoLugarGeoreferenciacion")));
			obj.setRutaFoto(cursor.getString(cursor.getColumnIndex("rutaFoto")));
			obj.setObservaciones(cursor.getString(cursor
					.getColumnIndex("observaciones")));
			obj.setVersion(cursor.getInt(cursor.getColumnIndex("Version")));
			obj.setSwCompleto(cursor.getInt(cursor.getColumnIndex("SwCompleto")) == 1 ? true
					: false);
			obj.setSwEnviado(cursor.getInt(cursor.getColumnIndex("SwEnviado")) == 1 ? true
					: false);
		}
		cursor = null;
		cursor = db
				.rawQuery(
						"select * from PUNTOS_GPS where codigoLocalPadron=? and codigoPredio=?",
						new String[] { codigoLocalPadron + "",
								codigoPredio + "" });
		if (cursor.moveToFirst()) {
			while (!cursor.isAfterLast()) {
				PUNTOS_GPS gps = new PUNTOS_GPS();
				gps.setCodigoLocalPadron(cursor.getString(cursor
						.getColumnIndex("codigoLocalPadron")));
				gps.setCodigoPredio(cursor.getInt(cursor
						.getColumnIndex("codigoPredio")));
				gps.setCodigoPuntoGPS(cursor.getInt(cursor
						.getColumnIndex("codigoPuntoGPS")));
				gps.setTextoPunto(cursor.getString(cursor
						.getColumnIndex("textoPunto")));
				gps.setLatitudPunto(cursor.getString(cursor
						.getColumnIndex("latitudPunto")));
				gps.setLongitudPunto(cursor.getString(cursor
						.getColumnIndex("longitudPunto")));
				gps.setAltitudPunto(cursor.getString(cursor
						.getColumnIndex("altitudPunto")));
				gps.setVersion(cursor.getInt(cursor.getColumnIndex("Version")));
				gps.setSwCompleto(cursor.getInt(cursor
						.getColumnIndex("SwCompleto")) == 1 ? true : false);
				gps.setSwEnviado(cursor.getInt(cursor
						.getColumnIndex("SwEnviado")) == 1 ? true : false);
				listaGPS.add(gps);
				cursor.moveToNext();
			}
		}
		List<Object> lista = new ArrayList<Object>();
		lista.add(obj);
		lista.add(listaGPS);
		Cerrar();
		return lista;
	}

	public List<Object> obtenerPuntos_GPS(String codigoLocalPadron,
			int numeroPredio) {

		List<Object> datosGps = new ArrayList<Object>();
		String[] args = new String[] { codigoLocalPadron, numeroPredio + "" };

		db = util.getReadableDatabase();
		int codigoLugarGeoreferenciacion = 0;
		String rutaFoto = "";
		String observaciones = "";
		int codigoPredio = 0;
		String textoPunto = "";
		String latitudPunto = "";
		String longitudPunto = "";
		String altitudPunto = "";

		cursor = db
				.rawQuery(
						"SELECT PUNTO3.codigoLugarGeoreferenciacion, PUNTO3.rutaFoto, PUNTO3.observaciones, PUNTO3.codigoPredio, PUNTOS_GPS.textoPunto, PUNTOS_GPS.latitudPunto, PUNTOS_GPS.longitudPunto, PUNTOS_GPS.altitudPunto FROM PUNTO3 INNER JOIN PUNTOS_GPS on PUNTO3.codigoLocalPadron=PUNTOS_GPS.codigoLocalPadron where PUNTOS_GPS.codigoLocalPadron=? and PUNTOS_GPS.codigoPredio=?",
						args);
		if (cursor.moveToFirst()) {
			do {

				codigoLugarGeoreferenciacion = Integer.parseInt(cursor
						.getString(0));
				rutaFoto = cursor.getString(1);
				observaciones = cursor.getString(2);
				codigoPredio = Integer.parseInt(cursor.getString(3));
				textoPunto = cursor.getString(4);
				latitudPunto = cursor.getString(5);
				longitudPunto = cursor.getString(6);
				altitudPunto = cursor.getString(7);

				datosGps.add(codigoLugarGeoreferenciacion);
				datosGps.add(rutaFoto);
				datosGps.add(observaciones);
				datosGps.add(codigoPredio);
				datosGps.add(textoPunto);
				datosGps.add(latitudPunto);
				datosGps.add(longitudPunto);
				datosGps.add(altitudPunto);

			} while (cursor.moveToNext());
		}
		Cerrar();

		return datosGps;

	}

	public void eliminarPuntosGPS(String codigoLocalPadron, int numPredio) {
		String[] args = new String[] { codigoLocalPadron + "", numPredio + "" };
		if (obtenerPuntos_GPS(codigoLocalPadron, numPredio).size() > 0) {
			db = util.getWritableDatabase();
			db.delete("PUNTO3", "codigoLocalPadron=? and codigoPredio=?", args);
			db.delete("PUNTOS_GPS", "codigoLocalPadron=? and codigoPredio=?",
					args);
			db.close();
		}
	}

	protected void Cerrar() {
		cursor.close();
		db.close();
	}

	public List<String> obtenerPredios(String codigoLocal) {
		String[] args = new String[] { codigoLocal };
		SQLiteDatabase bd = util.getReadableDatabase();
		List<String> predios = new ArrayList<String>();
		Cursor cursor = bd.rawQuery(
				"SELECT codigoPredio FROM PUNTO3 where codigoLocalPadron=?",
				args);
		if (cursor.moveToFirst()) {
			do {
				predios.add(cursor.getString(0));
			} while (cursor.moveToNext());
		}
		bd.close();
		cursor.close();
		return predios;
	}

	public void eliminarPredio(String codigoLocalPadron, String numeroPredio,
			ListadoPrediosRuralAdapter adapter, int pos) {
		String[] args = new String[] { codigoLocalPadron, numeroPredio };
		if (obtenerPredios(codigoLocalPadron).size() > 0) {
			db = util.getWritableDatabase();
			db.delete("PUNTO3", "codigoLocalPadron=? and codigoPredio=?", args);
			db.delete("PUNTOS_GPS", "codigoLocalPadron=? and codigoPredio=?",
					args);
			adapter.listaPredios.remove(pos);
			adapter.notifyDataSetChanged();
			db.close();
		}
	}
}
